package main

import (
	"fmt"
	"reflect"
)

// 反射 通过反射可以获取一个接口类型变量的 类型和数值
// type Cat struct{}

// func reflectType(x interface{}){
// 	// 我不知道别人调用我这个函数的时候会传进来什么类型的参数
// 		// 方法1.通过类型断言
// 		// 方法2.借助反射
// 	v:=reflect.TypeOf(x)
// 	fmt.Printf("type: %v\n",v)
// 	fmt.Printf("type name:%v type kind:%v\n",v.Name(),v.Kind())
// }
// 2.结构体反射
type student struct {
	Name  string `json:"name" int:"s_name"`
	Score int    `json:"score" int:"s_score"`
}

func main() {
	// var a float32=3.14
	// reflectType(a)
	// var b int64=100
	// reflectType(b)
	// var c=Cat{}
	// reflectType(c)

	stu := student{
		Name:  "小王子",
		Score: 20,
	}
	t := reflect.TypeOf(stu)
	fmt.Printf("name:%v kind:%v\n", t.Name(), t.Kind())
	// 遍历结构体变量的所有成员
	for i := 0; i < t.NumField(); i++ {
		// 根据结构体字段的索引取字段
		fileObj := t.Field(i)
		fmt.Printf("name:%v,type:%v,tag:=%v\n", fileObj.Name, fileObj.Type, fileObj.Tag)
		fmt.Printf(fileObj.Tag.Get("json"), fileObj.Tag.Get("int"))
	}
}
